package juego.tipos;

import  java.lang.Math;
import java.lang.Double;


public class Vector{
	
	protected double x;
	protected double y;
	
	public Vector(){
	/*Sin este metodo(constructor sin parametros), el compilador me lanza el siguiente mensaje de error:
		************************************************
		*juego/tipos/Posicion.java:8: cannot find symbol
		*symbol  : constructor Vector()
		*location: class juego.tipos.Vector
		*	public Posicion(double xinicial, double yinicial){
	        *                                  		         ^
		*juego/tipos/Velocidad.java:7: cannot find symbol
		*symbol  : constructor Vector()
		*location: class juego.tipos.Vector
		*	public Velocidad(Vector direccion, double modulo, double velocidadAngular){
	        *                                                  		                  ^
		*2 errors
		*************************************************
		(los '^' los coloca bajo las '{' )
	Quisiera entender que significa eso, o a que se debe.

	Nota: si dejo a Vector sin construcotres personalizados, no lanza el error y compila 
	normalmente.
	*/
	}

	//Inicializa una instancia de Vector con los valores de coordenadas
	//(x,y) pasados por parametro.

	public Vector(double xinicial, double yinicial){
		this.set(xinicial, yinicial);
	}

	protected void set(double nuevox, double nuevoy){		 
		x =nuevox;
		y =nuevoy;
	}
	
	protected boolean igualA(Vector otro){
		return( x - otro.x < 1E-6)&&( x - otro.x > -1E-6)&&( y - otro.y < 1E-6)&&( y - otro.y > -1E-6);

	}

	//Suma el valor de las coordenadas del receptor, segun las del parametro.
	public void transladar(Vector delta){
		set(x +delta.x, y + delta.y);
	}
	
	protected double longitud(){
		/*Implementacion Smalltalk:
		^(self dotProduct: self) sqrt*/
		//Esto es la norma del Vector.
		return Math.sqrt(x*x + y*y);

	}

	//Devuelve el angulo que forma el Vector con el eje x.
	public double theta(){
		/*Implementacion Smalltalk:
		"Answer the angle the receiver makes with origin in radians. 
		| tan theta |
		x = 0
		    ifTrue: [y >= 0
			ifTrue: [^ 1.570796326794897 "90.0 degreesToRadians"]
			ifFalse: [^ 4.71238898038469 "270.0 degreesToRadians"]]
		    ifFalse: 
			[tan := y asFloat / x asFloat.
			theta := tan arcTan.
			x >= 0
				ifTrue: [y >= 0
					ifTrue: [^theta]
					ifFalse: [^"360.0 degreesToRadians" 6.283185307179586 + theta]]
				ifFalse: [^"180.0 degreesToRadians" 3.141592653589793 + theta]] */

		double tan, theta;
		Double x = new Double(this.x);
		Double y = new Double(this.y);
		
		if(x.compareTo(0.0)== 0){
			if(y.compareTo(0.0)>0){
				return Math.toRadians(90);
			}else{
				if(y.compareTo(0.0)==0){
					return 0;
				}else{
					return Math.toRadians(270);
				}
			}	
		}else{
			tan = y / x;
			theta = Math.atan(tan);
			if(x.compareTo(0.0)>=0){
				if(y.compareTo(0.0)>=0){
					return theta;
				}else{
					return Math.toRadians(360)+theta;
				}
			}else{
				return Math.toRadians(180)+theta;
			}
		}
	}//Fin theta

	//Devuelve el vector diferencia parametro - receptor
	public Vector dirigidoA(Vector destino)
	{
		return new Vector(destino.x - x, destino.y -y);
	}
	
	public double getX(){
		return x;
	}

	public double getY(){
		return y;
	}
}	
	
